﻿using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace UILibrary
{
    public class ShellControl : UserControl
    {
        private readonly Container _components = null;
        private ShellTextBox _shellTextBox;

        public bool AsyncCall
        {
            get { return _shellTextBox.asyncCall; }
            set { _shellTextBox.asyncCall = value; }
        }

        public string CurrentLine
        {
            get { return _shellTextBox.CurrentLine; }
            set { _shellTextBox.CurrentLine = value; }
        }

        public string InitText
        {
            set { _shellTextBox.InitText = value; }
        }

        public string Prompt
        {
            get { return _shellTextBox.Prompt; }
            set { _shellTextBox.Prompt = value; }
        }

        public string PromptAtLevel1
        {
            get { return _shellTextBox.PromptAtLevel1; }
            set { _shellTextBox.PromptAtLevel1 = value; }
        }

        public string PromptAtLevel2
        {
            get { return _shellTextBox.PromptAtLevel2; }
            set { _shellTextBox.PromptAtLevel2 = value; }
        }

        public int PromptLevel
        {
            get { return _shellTextBox.PromptLevel; }
            set { _shellTextBox.PromptLevel = value; }
        }

        public Color ShellTextBackColor
        {
            get
            {
                return _shellTextBox != null
                    ? _shellTextBox.BackColor
                    : Color.Black;
            }
            set
            {
                if (_shellTextBox != null)
                    _shellTextBox.BackColor = value;
            }
        }

        public Font ShellTextFont
        {
            get
            {
                return _shellTextBox != null
                    ? _shellTextBox.Font
                    : new Font("Tahoma", 8f);
            }
            set
            {
                if (_shellTextBox != null)
                    _shellTextBox.Font = value;
            }
        }

        public Color ShellTextForeColor
        {
            get
            {
                return _shellTextBox != null
                    ? _shellTextBox.ForeColor
                    : Color.LightGray;
            }
            set
            {
                if (_shellTextBox != null)
                    _shellTextBox.ForeColor = value;
            }
        }

        public event EventCommandEntered CommandEntered;

        public ShellControl()
        {
            InitializeComponent();
            _shellTextBox.KeyDown += ShellTextBoxKeyDown;
        }

        public void Clear()
        {
            _shellTextBox.Clear();
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing && _components != null)
                _components.Dispose();

            base.Dispose(disposing);
        }

        internal void FireCommandEntered(string command)
        {
            OnCommandEntered(command);
        }

        public string[] GetCommandHistory()
        {
            return _shellTextBox.GetCommandHistory();
        }

        private void InitializeComponent()
        {
            _shellTextBox = new ShellTextBox();
            SuspendLayout();
            _shellTextBox.AcceptsReturn = true;
            _shellTextBox.AcceptsTab = true;
            _shellTextBox.BackColor = Color.Black;
            _shellTextBox.Dock = DockStyle.Fill;
            _shellTextBox.Font = new Font("Lucida Console", 8.25f, FontStyle.Regular, GraphicsUnit.Point, 0);
            _shellTextBox.ForeColor = Color.LawnGreen;
            _shellTextBox.Location = new Point(0, 0);
            _shellTextBox.MaxLength = 0;
            _shellTextBox.Multiline = true;
            _shellTextBox.Name = "_shellTextBox";
            _shellTextBox.Prompt = ">>>";
            _shellTextBox.ScrollBars = ScrollBars.Both;
            _shellTextBox.Size = new Size(0xe8, 0xd8);
            _shellTextBox.TabIndex = 0;
            Controls.Add(_shellTextBox);
            Name = "ShellControl";
            Size = new Size(0xe8, 0xd8);
            ResumeLayout(false);
            PerformLayout();
        }

        protected virtual void OnCommandEntered(string command)
        {
            if (CommandEntered != null)
                CommandEntered(command, new CommandEnteredEventArgs(command));
        }

        public void PrintPrompt()
        {
            _shellTextBox.PrintPrompt();
        }

        private void ShellTextBoxKeyDown(object sender, KeyEventArgs e)
        {
            OnKeyDown(e);
        }

        public void WriteText(string text)
        {
            _shellTextBox.WriteText(text);
        }
    }
}

